iT邦幫忙

2023 iThome 鐵人賽

DAY 6
0
自我挑戰組

Rayeee 的 TypeScript 的學習日記系列 第 6

<20230907> Day6. 再...再一口... 再來一口 Type Inference & Type Annotations

  • 分享至 

  • xImage
  •  

今天來繼續探討 Type Annotations(型別註釋) 以及 Type Inference(型別推論) 的部分

今日重點:

  • function 的 Type

我們昨天有提到 一般情況下,TypeScript 是建議使用 Type Inference 型別推論
只有在這三種情況下我們會依賴型別註釋 Type Annotations

  1. 當有一個 function 回傳 any type,但我們需要正確的 type 的時候
  2. 當我們把變數宣告及變數賦值這兩個事情分兩行的時候
  3. 當型別推論 Type Inference 無法正確的判斷 Type 時

下面就先來補充第一點,function 中,為甚麼要使用 Type Annotations

function 中的 Type

先來談談 function 中的 Type,在 JavaScript 中我們會關注 function 的 回傳值 以及 傳入的參數 這兩個變量
而在 TypeScript 中, Type Inference 只會對 function 的回傳值作用,不會對傳入的參數作用

可以看下面三種 TypeScript 的 function:

  1. 不註釋,只依靠 Type Inference

add 的回傳值、參數 a, b 都會被推斷為 any Type

function add(a, b) {
  return a + b
}
  1. 只對回傳值 Type Annotations
    add 被 Type Annotations 成 number Type
    參數 a, b 還是被 Type Inference 為 any Type
    傳入的參數並沒有因為 function 回傳的是 number Type 而自動被推論成 number Type
function add2(a, b):number {
  return a + b
}
  1. 只對傳入參數 Type Annotations
    對參數 a, b Type Annotations 為 number Type
    add 居然被 Type Inference 成 number Type 了!!
    TypeScript 偵測傳入參數的 Type 以及本身 function 裡面所做的上下文,讓 TypeScript 推斷回傳值也會是 number Type
    就如上述所說 Type Inference 只會對 function 的回傳值作用,不會對傳入的參數作用
function add3(a: number, b: number) {
  return a + b
}

可以看到只有最後例子的回傳值有自動被被正確的 Type Inference

https://ithelp.ithome.com.tw/upload/images/20230907/20162544gnuw5nvrX6.png


這裡再舉個生活小例子

可以注意到,我們已經知道 function 中可以透過 Type Annotations 傳入的參數,讓 Type Inference 自動推論回傳值的 Type,那是不是代表 欸欸欸我們只要對傳入參數做註解就好了耶,反正回傳值就給 TypeScript 自己推論出來就好啦~

可能不太對,因為 TypeScript 並不會檢查型別以外的錯誤,所以有時候還是會有意外發生
什麼是型別以外的錯誤呢?像是下面的例子

function add(a: number, b: number) {
    a - b
}

上面範例,儘管命名為 add(),但是裡面做的卻是減法的邏輯而不是 add 這個意思要做的加法,這種錯誤明顯的 TypeScript 不會報錯,因為他只理會類型
聽起來十分合理,但是這樣的機制會使一些錯誤就這樣不會被檢查到

像是如一開始的範例,function 的回傳值是可以透過 Type Inference 推論出來的

像這樣,可以看到回傳值也可以正確地知道其 Type 為何

https://ithelp.ithome.com.tw/upload/images/20230907/20162544peviEfn2wH.png

但是假設我們不小心這樣寫

function add(a: number, b: number) {
    a + b
}

哎呀,有發現嗎?我們其實是預期他回傳 number Type 的回傳值,但是我們 不免偶爾 漏掉了 return,這時 function 沒有回傳值,所以回傳值就被 Type Inference 成 void Type 了

https://ithelp.ithome.com.tw/upload/images/20230907/20162544lteYNJRlBd.png

因為 TpyeScript 不檢查邏輯,所以造成了這個問題,它只會覺得這就是開發者需要的東西

所以雖然 TypeScript 可以對函式類型使用 Type Inference,但通常我們會主動使用 Type Annotations 來明確的表示函數的參數以及返回值的型別

以上就是對 Type Annotations & Type Inference 大致上的介紹
重點大致如下

  • 何時使用 Type Annotations、何時使用 Type Inference
  • 使用函式,我們通常的對傳入參數及返回值用 annotations
  • 處理變數的 Tpye 時,我們盡可能的依賴 Type Inference,除非遇到前面說的三種情況

下一章會寫 TypeScript 中的陣列及數組 (Tuples) 還有一些補充一些小姿勢


上一篇
<20230906> Day5. 型別推論及型別註釋 Type Inference & Type Annotations 簡介一下下
下一篇
<20230908> Day7. TypeScript 中的 Array,不是噁瑞
系列文
Rayeee 的 TypeScript 的學習日記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言